import json
from django_redis import get_redis_connection
from doctors.models import DoctorModel


# 获取当前用户的所有优惠劵：使用、未使用、过期的
def get_user_coupon_list(user_id):
    redis = get_redis_connection('coupon')
    coupon_list = redis.keys(f'{user_id}:*')
    # b'1':b'1'   b'b1:b2'  b表示字节类型  byte
    # 1:14
    # :分割  最后一位
    coupon_id_list = [i.decode() for i in coupon_list]

    coupon_data = []
    for coupon_key in coupon_id_list:
        # 1:14
        # 获取优惠劵id
        coupon_item = {"user_coupon_id": int(coupon_key.split(':')[-1])}
        # 根据当前的key，获取所对应的所有的属性
        coupon_hash = redis.hgetall(coupon_key)
        # 循环coupon_hash，获取所有属性
        for key, value in coupon_hash.items():
            key = key.decode()
            value = value.decode()
            # 判断  key  获取到的key为外键的情况下，需要对value进行json处理
            if key in ['to_doctor']:
                value = json.loads(value)

            coupon_item[key] = value
        coupon_data.append(coupon_item)
    return coupon_data


# 获取当前用户有效优惠劵：购买时候   当前下单可用优惠劵
def get_user_enable_coupon_list(user_id, doctor_id):
    # 获取当前用户本次下单的优惠劵列表
    doctor_list = DoctorModel.objects.filter(id=doctor_id)
    doctor_id_list = set()

    # 课程1 课程2 课程3 课程4 课程5
    # 1     1    1    2     2   集合去重
    for doctor in doctor_list:
        doctor_id_list.add(doctor.id)
    # 获取优惠劵列表，get_user_coupon_list函数已经实现，调用即可
    coupon_data = get_user_coupon_list(user_id)

    # 构建一个可用的优惠劵列表的空对象，用于存储比对完成的优惠劵数据
    enable_coupon_list = []

    # 循环比对，循环优惠劵数据
    for item in coupon_data:
        # 优惠劵类型：通用、减免、折扣
        # 课程类型：课程、分类、方向
        # 通用优惠劵是所有课程通用，是一个可用优惠劵
        coupon_type = int(item.get('coupon_type'))
        if coupon_type == 0:
            # 通用优惠劵
            item['enable_course'] = '__all__'
            enable_coupon_list.append(item)
        elif coupon_type == 1:
            # 方向优惠劵  获取所有医生的id
            # 优惠劵对应方向的列表
            coupon_direction = {doctor_item['doctor__id'] for doctor_item in item.get('to_doctor')}
            ret = coupon_direction & doctor_id_list
            if len(ret) > 0:
                # 可用课程id
                item['enable_doctor'] = {int(doctor.id) for doctor in doctor_list if doctor.id in ret}
                enable_coupon_list.append(item)

    return enable_coupon_list
